package interfaz;

import javax.swing.JPanel;
import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JRadioButtonMenuItem;
import javax.swing.JInternalFrame;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.util.NoSuchElementException;
import java.util.Vector;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.WindowConstants;
import javax.swing.JCheckBoxMenuItem;

import excepciones.ContenidoException;

import logica.analizador.AnalizadorSintactico;
import logica.estructura.DiedMerger;

public class Principal extends JFrame implements ActionListener, WindowListener{

	private Vector<String> separadores=new Vector<String>();
	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JMenuBar jJMenuBar = null;
	private JMenu jMenu1 = null;
	private JRadioButtonMenuItem jRadioButtonMenuItem = null;
	private JRadioButtonMenuItem jRadioButtonMenuItem1 = null;
	private JInternalFrame jInternalFrame = null;
	private JPanel jContentPane1 = null;
	private JInternalFrame jInternalFrame1 = null;
	private JPanel jContentPane2 = null;
	private JScrollPane jScrollPane = null;
	private JScrollPane jScrollPane1 = null;
	private JTextPane jTextPane = null;
	private JTextPane jTextPane1 = null;
	private JMenuItem jMenuItem1 = null;
	private JMenuItem jMenuItem = null;
	private JMenu jMenu = null;
	private JMenuItem jMenuItem2 = null;
	private JCheckBoxMenuItem jCheckBoxMenuItem = null;
	private JMenu jMenu2 = null;
	private JMenu jMenu3 = null;
	private JMenuItem jMenuItem3 = null;
	private JMenu jMenu4 = null;
	private JMenuItem jMenuItem4 = null;
	/**
	 * This is the default constructor
	 */
	public Principal() {
		super();
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(600, 340);
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		double fil=dim.getWidth();
		double col=dim.getHeight();
		fil=(fil-600)/2;
		col=(col-340)/2;
		this.setLocation((int)fil, (int)col);
		this.setResizable(false);
		this.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		this.setJMenuBar(getJJMenuBar());
		this.setContentPane(getJContentPane());
		this.setTitle("Principal");
		this.getJRadioButtonMenuItem().setSelected(true);
		this.addWindowListener(this);
		this.separadores.addElement(" |\n"); //se agrega espacio en blanco
		this.separadores.addElement("\n"); //se agrega enter
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BoxLayout(getJContentPane(), BoxLayout.X_AXIS));
			jContentPane.add(getJInternalFrame(), null);
			jContentPane.add(getJInternalFrame1(), null);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jJMenuBar	
	 * 	
	 * @return javax.swing.JMenuBar	
	 */
	private JMenuBar getJJMenuBar() {
		if (jJMenuBar == null) {
			jJMenuBar = new JMenuBar();
			jJMenuBar.add(getJMenu());
			jJMenuBar.add(getJMenu1());
			jJMenuBar.add(Box.createHorizontalGlue());
			jJMenuBar.add(getJMenu4());
		}
		return jJMenuBar;
	}

	/**
	 * This method initializes jMenu1	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getJMenu1() {
		if (jMenu1 == null) {
			jMenu1 = new JMenu();
			jMenu1.setText("Opciones");
			jMenu1.add(getJMenu3());
			jMenu1.add(getJMenu2());
		}
		return jMenu1;
	}

	/**
	 * This method initializes jRadioButtonMenuItem	
	 * 	
	 * @return javax.swing.JRadioButtonMenuItem	
	 */
	private JRadioButtonMenuItem getJRadioButtonMenuItem() {
		if (jRadioButtonMenuItem == null) {
			jRadioButtonMenuItem = new JRadioButtonMenuItem();
			jRadioButtonMenuItem.setText("Formato numerado");
			jRadioButtonMenuItem.addActionListener(this);
		}
		return jRadioButtonMenuItem;
	}

	/**
	 * This method initializes jRadioButtonMenuItem1	
	 * 	
	 * @return javax.swing.JRadioButtonMenuItem	
	 */
	private JRadioButtonMenuItem getJRadioButtonMenuItem1() {
		if (jRadioButtonMenuItem1 == null) {
			jRadioButtonMenuItem1 = new JRadioButtonMenuItem();
			jRadioButtonMenuItem1.setText("Formato Wiki");
			jRadioButtonMenuItem1.addActionListener(this);
		}
		return jRadioButtonMenuItem1;
	}

	/**
	 * This method initializes jInternalFrame	
	 * 	
	 * @return javax.swing.JInternalFrame	
	 */
	private JInternalFrame getJInternalFrame() {
		if (jInternalFrame == null) {
			jInternalFrame = new JInternalFrame();
			jInternalFrame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
			jInternalFrame.setTitle("Texto 1");
			jInternalFrame.setVisible(true);
			jInternalFrame.setContentPane(getJContentPane1());
		}
		return jInternalFrame;
	}

	/**
	 * This method initializes jContentPane1	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJContentPane1() {
		if (jContentPane1 == null) {
			GridLayout gridLayout = new GridLayout();
			gridLayout.setRows(1);
			jContentPane1 = new JPanel();
			jContentPane1.setLayout(gridLayout);
			jContentPane1.add(getJScrollPane(), null);
		}
		return jContentPane1;
	}

	/**
	 * This method initializes jInternalFrame1	
	 * 	
	 * @return javax.swing.JInternalFrame	
	 */
	private JInternalFrame getJInternalFrame1() {
		if (jInternalFrame1 == null) {
			jInternalFrame1 = new JInternalFrame();
			jInternalFrame1.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
			jInternalFrame1.setTitle("Texto 2");
			jInternalFrame1.setVisible(true);
			jInternalFrame1.setContentPane(getJContentPane2());
		}
		return jInternalFrame1;
	}

	/**
	 * This method initializes jContentPane2	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJContentPane2() {
		if (jContentPane2 == null) {
			GridLayout gridLayout1 = new GridLayout();
			gridLayout1.setRows(1);
			jContentPane2 = new JPanel();
			jContentPane2.setLayout(gridLayout1);
			jContentPane2.add(getJScrollPane1(), null);
		}
		return jContentPane2;
	}

	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setViewportView(getJTextPane());
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jScrollPane1	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane1() {
		if (jScrollPane1 == null) {
			jScrollPane1 = new JScrollPane();
			jScrollPane1.setViewportView(getJTextPane1());
		}
		return jScrollPane1;
	}

	/**
	 * This method initializes jTextPane	
	 * 	
	 * @return javax.swing.JTextPane	
	 */
	private JTextPane getJTextPane() {
		if (jTextPane == null) {
			jTextPane = new JTextPane();
		}
		return jTextPane;
	}

	/**
	 * This method initializes jTextPane1	
	 * 	
	 * @return javax.swing.JTextPane	
	 */
	private JTextPane getJTextPane1() {
		if (jTextPane1 == null) {
			jTextPane1 = new JTextPane();
		}
		return jTextPane1;
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		
		if(arg0.getActionCommand()=="Ayuda en linea")
		{
			Ayuda a=new Ayuda(this);
			a.setModal(true);
			a.setVisible(true);
		}
		
		if(arg0.getActionCommand()=="Red Semantica")
		{
			String textoEnlazado1=this.getJTextPane().getText();
			
			AnalizadorSintactico aA = new AnalizadorSintactico(textoEnlazado1);
			
			try {
				if(this.getJTextPane().getText().equals(""))
				{
					throw new NullPointerException();
				}
				aA.validar();
				RSemantica rs=new RSemantica(textoEnlazado1);
				
				this.setVisible(false);
				rs.setVisible(true);
				this.dispose();
			} catch (StringIndexOutOfBoundsException e){
				JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
			} catch (NoSuchElementException e) {
				JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
			} catch (NullPointerException e) {
				JOptionPane.showMessageDialog(this, "Los textos no pueden ser vacios", "Atencion!", 1);
			} catch (ContenidoException e) {
				JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
			}
		}
		
		if(arg0.getActionCommand()=="Fusionar")
		{
			Vector<String> parametros=new Vector<String>();
			if(this.getJCheckBoxMenuItem().isSelected())
			{
				String opcion="contarpalabras = true";
				parametros.addElement(opcion);
			}
			
			String resultado="";
			
			try
			{
				resultado=DiedMerger.merge(this.getJTextPane().getText(), this.getJTextPane1().getText(), parametros, separadores);
				Fusion f=new Fusion(this,resultado);
				f.setModal(true);
				f.setVisible(true);
			} catch(Exception e) {
				JOptionPane.showMessageDialog(this, "Se ha producido un error inesperado", "Error", 0);
			}
		}
		
		if(arg0.getActionCommand()=="Separadores")
		{
			Separadores s=new Separadores(this);
			s.setModal(true);
			s.setVisible(true);
		}
		
		if(arg0.getActionCommand()=="Renderizar")
		{
	/*		String texto1= "<sec>" +
			"<tit> El ingenioso Hidalgo Don Quijote de la Mancha </tit>" +
			"<con>" +
				"<sec>" +
					"<tit> Capitulo 1  </tit>" +
					"<con>" +
						"En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no hace mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor..." +
					"</con>" +
				"</sec>" +
				"<sec>" +
					"<tit>Capítulo 2</tit>" +
					"<con>" +
						"En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no hace mucho tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, rocín flaco y galgo corredor..." +
					"</con>" +
				"</sec>" +
			"</con>" +
		"</sec>";
			this.getJTextPane().setText(texto1);
			this.getJTextPane1().setText(texto1.replace('f', 'F'));*/
			
			
			try {
				if(this.getJTextPane().getText().equals("") || this.getJTextPane1().getText().equals(""))
				{
					throw new NullPointerException();
				}
				
				AnalizadorSintactico a=new AnalizadorSintactico(this.getJTextPane().getText());
				AnalizadorSintactico a2=new AnalizadorSintactico(this.getJTextPane1().getText());
				
				a.validar();
				a2.validar();
				Salida salida=new Salida(this,this.getJRadioButtonMenuItem1().isSelected(),this.getJTextPane().getText(),this.getJTextPane1().getText());
				salida.setModal(true);
				salida.setVisible(true);
			} catch (StringIndexOutOfBoundsException e){
				JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
			} catch (NoSuchElementException e) {
				JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
			} catch (NullPointerException e) {
				JOptionPane.showMessageDialog(this, "Los textos no pueden ser vacios", "Atencion!", 1);
			} catch (Exception e) {
				JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
			}
			
		}
		
		if(arg0.getActionCommand()=="Salir")
		{
			int opcion=JOptionPane.showConfirmDialog(this, "Esta seguro?", "Ha pulsado salir", JOptionPane.YES_NO_OPTION);
			if(opcion==0)
			{
				this.dispose();
			}
		}
		if(arg0.getActionCommand()=="Formato numerado")
		{
			if(this.getJRadioButtonMenuItem().isSelected())
			{
				this.getJRadioButtonMenuItem1().setSelected(false);
			}
			else
			{
				this.getJRadioButtonMenuItem1().setSelected(true);
			}
		}
		if(arg0.getActionCommand()=="Formato Wiki")
		{
			if(this.getJRadioButtonMenuItem1().isSelected())
			{
				this.getJRadioButtonMenuItem().setSelected(false);
			}
			else
			{
				this.getJRadioButtonMenuItem().setSelected(true);
			}
		}
	}

	/**
	 * This method initializes jMenuItem1	
	 * 	
	 * @return javax.swing.JMenuItem	
	 */
	private JMenuItem getJMenuItem1() {
		if (jMenuItem1 == null) {
			jMenuItem1 = new JMenuItem();
			jMenuItem1.setText("Renderizar");
			jMenuItem1.addActionListener(this);
		}
		return jMenuItem1;
	}

	@Override
	public void windowActivated(WindowEvent arg0) {
	}

	@Override
	public void windowClosed(WindowEvent arg0) {
	}

	/**
	 * funcion que llama al dialogo cuando se cierra una ventana
	 */
	@Override
	public void windowClosing(WindowEvent arg0) {
		int opcion=JOptionPane.showConfirmDialog(this, "Esta seguro?", "Ha pulsado salir", JOptionPane.YES_NO_OPTION);
		if(opcion==0)
		{
			this.dispose();
		}
	}

	@Override
	public void windowDeactivated(WindowEvent arg0) {
	}

	@Override
	public void windowDeiconified(WindowEvent arg0) {
	}

	@Override
	public void windowIconified(WindowEvent arg0) {
	}

	@Override
	public void windowOpened(WindowEvent arg0) {
	}

	/**
	 * This method initializes jMenuItem	
	 * 	
	 * @return javax.swing.JMenuItem	
	 */
	private JMenuItem getJMenuItem() {
		if (jMenuItem == null) {
			jMenuItem = new JMenuItem();
			jMenuItem.setText("Separadores");
			jMenuItem.addActionListener(this);
		}
		return jMenuItem;
	}
	
	/**
	 * permite setear un vector con separadores
	 * @param separadoresApertura
	 */
	public void setSeparadores(Vector<String> separadores)
	{
		this.separadores=separadores;
	}
	
	/**
	 * @return retorna el vector con los separadores
	 */
	public Vector<String> getSeparadores()
	{
		return this.separadores;
	}

	/**
	 * This method initializes jMenu	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getJMenu() {
		if (jMenu == null) {
			jMenu = new JMenu();
			jMenu.setText("Archivo");
			jMenu.add(getJMenuItem2());
			jMenu.add(getJMenuItem1());
			jMenu.add(getJMenuItem3());
		}
		return jMenu;
	}

	/**
	 * This method initializes jMenuItem2	
	 * 	
	 * @return javax.swing.JMenuItem	
	 */
	private JMenuItem getJMenuItem2() {
		if (jMenuItem2 == null) {
			jMenuItem2 = new JMenuItem();
			jMenuItem2.setText("Fusionar");
			jMenuItem2.addActionListener(this);
		}
		return jMenuItem2;
	}

	/**
	 * This method initializes jCheckBoxMenuItem	
	 * 	
	 * @return javax.swing.JCheckBoxMenuItem	
	 */
	private JCheckBoxMenuItem getJCheckBoxMenuItem() {
		if (jCheckBoxMenuItem == null) {
			jCheckBoxMenuItem = new JCheckBoxMenuItem();
			jCheckBoxMenuItem.setText("Comparar palabras");
		}
		return jCheckBoxMenuItem;
	}

	/**
	 * This method initializes jMenu2	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getJMenu2() {
		if (jMenu2 == null) {
			jMenu2 = new JMenu();
			jMenu2.setText("Fusionar");
			jMenu2.add(getJMenuItem());
			jMenu2.add(getJCheckBoxMenuItem());
		}
		return jMenu2;
	}

	/**
	 * This method initializes jMenu3	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getJMenu3() {
		if (jMenu3 == null) {
			jMenu3 = new JMenu();
			jMenu3.setText("Renderizar");
			jMenu3.add(getJRadioButtonMenuItem());
			jMenu3.add(getJRadioButtonMenuItem1());
		}
		return jMenu3;
	}

	/**
	 * This method initializes jMenuItem3	
	 * 	
	 * @return javax.swing.JMenuItem	
	 */
	private JMenuItem getJMenuItem3() {
		if (jMenuItem3 == null) {
			jMenuItem3 = new JMenuItem();
			jMenuItem3.setText("Red Semantica");
			jMenuItem3.addActionListener(this);
		}
		return jMenuItem3;
	}

	/**
	 * This method initializes jMenu4	
	 * 	
	 * @return javax.swing.JMenu	
	 */
	private JMenu getJMenu4() {
		if (jMenu4 == null) {
			jMenu4 = new JMenu();
			jMenu4.setText("Ayuda");
			jMenu4.add(getJMenuItem4());
		}
		return jMenu4;
	}

	/**
	 * This method initializes jMenuItem4	
	 * 	
	 * @return javax.swing.JMenuItem	
	 */
	private JMenuItem getJMenuItem4() {
		if (jMenuItem4 == null) {
			jMenuItem4 = new JMenuItem();
			jMenuItem4.setText("Ayuda en linea");
			jMenuItem4.addActionListener(this);
		}
		return jMenuItem4;
	}
}
